/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Automato;

import Dicionario.Dicionario;
import Dicionario.Frase;
import Dicionario.ListaFrases;
import Estado.Estado;
import Estado.StateArrow;
import java.util.Iterator;
import java.util.LinkedList;

/**
 *
 * @author Gonçalo Fernandes
 */
public class AutomatoBuilder {
    public Automato automato = new Automato();
    Dicionario dic = new Dicionario();
    
    public Automato Build(ListaFrases lf, Dicionario d)
    {
        dic=d;
        int palavraActual;
        int IDfrase;
        int size;
        Frase f;
        for (int i = 0; i < lf.getSize(); i++) {

            f = lf.getFrase(i);
            size=f.getSize();
            palavraActual = f.getInicio();
            IDfrase = f.getId();
            BuildStateArrow(f, palavraActual, IDfrase,size,lf);
            }  
        size =0;
        
        return automato;
    }
   




    public void BuildStateArrow(Frase fr, int palavraActual, int IDfrase, int size, ListaFrases lf) {

        int nextPalavra;

        Frase f = new Frase(fr);

        if (f.getSize() == 0) {
            return;
        } else {
            if (automato.getEstadoIndex(palavraActual) == -1) {
                //Cria, adiciona-o e retorna o index onde ficou
                CreateEstado(palavraActual);
            }
            int index = automato.getEstadoIndex(palavraActual);

            //se os sizes forem iguais entao sei que me encontro no inicio 
            if (f.getSize() == size) {
                automato.estados.get(index).setInicios(IDfrase);
            }
            if (f.getSize() != 1) {

                nextPalavra = f.getNextPalavra(0);
                palavraActual = nextPalavra;
                StateArrow st = new StateArrow(nextPalavra);
                st.addFrase(IDfrase);
                st.setOrigem(f.getInicio());
                automato.estados.get(index).addStateArrow(st);
            } else {
                automato.estados.get(index).setFins(IDfrase);
            }
            f.removefirstpalavra();
            BuildStateArrow(f, palavraActual, IDfrase, size, lf);
        }
    }
public int CreateEstado(int id) {

        Estado est = new Estado(id);
        est.setPalavra(dic.getPalavra(id));
        automato.estados.add(est);
        
        //retorna posicao onde o estado ficou.
        return automato.estados.indexOf(est);
    }
}
